package qjc.f_矩阵;

import java.util.ArrayList;
import java.util.List;

public class f2_螺旋矩阵 {
    /**
     * 初始化结果列表，检查输入矩阵是否为空，获取矩阵的行数和列数，
     * 初始化访问标记数组，计算矩阵中元素的总数，初始化起始位置，
     * 定义方向数组，表示右、下、左、上的移动方向，初始化方向索引，
     * 遍历矩阵中的所有元素，将当前元素加入结果列表，标记当前元素为已访问，
     * 计算下一个位置，检查下一个位置是否越界或已访问，如果越界或已访问，改变方向，
     * 更新当前位置，返回结果列表
     */
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return res;
        }
        int n = matrix.length, m = matrix[0].length;
        boolean[][] visited = new boolean[n][m];
        int total = n * m;
        int row = 0, col = 0;
        int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int dirIdx = 0;
        for (int i = 0; i < total; i++) {
            res.add(matrix[row][col]);
            visited[row][col] = true;
            int newRow = row + dirs[dirIdx][0];
            int newCol = col + dirs[dirIdx][1];
            if(newRow < 0 || newRow >= n || newCol < 0 || newCol >= m || visited[newRow][newCol]){
                dirIdx = (dirIdx + 1) % 4;
            }
            row += dirs[dirIdx][0];
            col += dirs[dirIdx][1];
        }
        return res;
    }
}
